import { swap } from '../../util';

/**
 * fisher–yates随机：从最后一项开始并将当前位置和一个随机位置进行交换，
 * 这个随机位置要比当前位置小。
 * @param array 原数组
 */
export function shuffle<T>(array: T[]) {
    // 从末尾往前遍历
    for (let i = array.length - 1; i > 0; i--) {
        // Math.random方法：返回介于0（包含）到1（不包含）之间的一个随机数
        const randomIndex = Math.floor(Math.random() * i);
        // 交换，可以保证末尾都是已随机的元素，而首部都是未随机的元素
        swap(array, i, randomIndex);
    }
    return array;
}
